Fix #399071, suggestion from Benoit Dejean.
authorKristian Rietveld <kris@gtk.org>
Mon, 4 Jun 2007 23:48:38 +0000 (23:48 +0000)
committerKristian Rietveld <kristian@src.gnome.org>
Mon, 4 Jun 2007 23:48:38 +0000 (23:48 +0000)
2007-06-05  Kristian Rietveld  <kris@gtk.org>

Fix #399071, suggestion from Benoit Dejean.

* gtk/gtkliststore.[ch] (gtk_list_store_set_vector_internal): new
function, factored out code iterating (columns, values) vectors from
gtk_list_store_new_with_valuesv to here,
(gtk_list_store_set_valuesv): new public function to set list store
values using (columns, values) vectors,
(gtk_list_store_new_with_valuesv): call new _set_vector_internal
instead.

* gtk/gtktreestore.[ch] (gtk_tree_store_set_vector_internal),
(gtk_tree_store_set_valuesv), (gtk_tree_store_new_with_valuesv):
likewise.

* gtk/gtk.symbols: updated.

svn path=/trunk/; revision=18041

ChangeLog
gtk/gtk.symbols
gtk/gtkliststore.c
gtk/gtkliststore.h
gtk/gtktreestore.c
gtk/gtktreestore.h

index d380de467df645bf2aa532567e9e8491b87cefeb..f60f5db01176331d755da9636f7ebecc35f2bfb0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2007-06-05  Kristian Rietveld  <kris@gtk.org>
+
+       Fix #399071, suggestion from Benoit Dejean.
+
+       * gtk/gtkliststore.[ch] (gtk_list_store_set_vector_internal): new
+       function, factored out code iterating (columns, values) vectors from
+       gtk_list_store_new_with_valuesv to here,
+       (gtk_list_store_set_valuesv): new public function to set list store
+       values using (columns, values) vectors,
+       (gtk_list_store_new_with_valuesv): call new _set_vector_internal
+       instead.
+
+       * gtk/gtktreestore.[ch] (gtk_tree_store_set_vector_internal),
+       (gtk_tree_store_set_valuesv), (gtk_tree_store_new_with_valuesv):
+       likewise.
+
+       * gtk/gtk.symbols: updated.
+
 2007-06-04  Richard Hult  <richard@imendio.com>
 
        * gdk/quartz/gdkwindow-quartz.c:
index 2c7963580dabaac00daadde2beef88aae6e227c9..2f60ca0bd2e4168b9c4d72beecaa4b31db6e7d41 100644 (file)
@@ -2138,6 +2138,7 @@ gtk_list_store_set
 gtk_list_store_set_column_types
 gtk_list_store_set_valist
 gtk_list_store_set_value
+gtk_list_store_set_valuesv
 gtk_list_store_swap
 #endif
 #endif
@@ -4259,6 +4260,7 @@ gtk_tree_store_set
 gtk_tree_store_set_column_types
 gtk_tree_store_set_valist
 gtk_tree_store_set_value
+gtk_tree_store_set_valuesv
 gtk_tree_store_swap
 #endif
 #endif
index 30123a23b8e3593c89577c3c1dfb50b9d8172107..dc5ebbfa9a1a1de61afb2904a1ad7bd5d0bec3ce 100644 (file)
@@ -710,6 +710,36 @@ gtk_list_store_get_compare_func (GtkListStore *list_store)
   return func;
 }
 
+static void
+gtk_list_store_set_vector_internal (GtkListStore *list_store,
+                                   GtkTreeIter  *iter,
+                                   gboolean     *emit_signal,
+                                   gboolean     *maybe_need_sort,
+                                   gint         *columns,
+                                   GValue       *values,
+                                   gint          n_values)
+{
+  gint i;
+  GtkTreeIterCompareFunc func = NULL;
+
+  func = gtk_list_store_get_compare_func (list_store);
+  if (func != _gtk_tree_data_list_compare_func)
+    *maybe_need_sort = TRUE;
+
+  for (i = 0; i < n_values; i++)
+    {
+      *emit_signal = gtk_list_store_real_set_value (list_store, 
+                                              iter, 
+                                              columns[i],
+                                              &values[i],
+                                              FALSE) || *emit_signal;
+
+      if (func == _gtk_tree_data_list_compare_func &&
+         columns[i] == list_store->sort_column_id)
+       *maybe_need_sort = TRUE;
+    }
+}
+
 static void
 gtk_list_store_set_valist_internal (GtkListStore *list_store,
                                    GtkTreeIter  *iter,
@@ -767,6 +797,53 @@ gtk_list_store_set_valist_internal (GtkListStore *list_store,
     }
 }
 
+/**
+ * gtk_list_store_set_valuesv:
+ * @list_store: A #GtkListStore
+ * @iter: A valid #GtkTreeIter for the row being modified
+ * @columns: an array of column numbers
+ * @values: an array of GValues 
+ * @n_values: the length of the @columns and @values arrays
+ * 
+ * A variant of gtk_list_store_set_valist() which
+ * takes the columns and values as two arrays, instead of
+ * varargs. This function is mainly intended for 
+ * language-bindings and in case the number of columns to
+ * change is not known until run-time.
+ *
+ * Since: 2.12
+ */
+void
+gtk_list_store_set_valuesv (GtkListStore *list_store,
+                           GtkTreeIter  *iter,
+                           gint         *columns,
+                           GValue       *values,
+                           gint          n_values)
+{
+  gboolean emit_signal = FALSE;
+  gboolean maybe_need_sort = FALSE;
+
+  g_return_if_fail (GTK_IS_LIST_STORE (list_store));
+  g_return_if_fail (VALID_ITER (iter, list_store));
+
+  gtk_list_store_set_vector_internal (list_store, iter,
+                                     &emit_signal,
+                                     &maybe_need_sort,
+                                     columns, values, n_values);
+
+  if (maybe_need_sort && GTK_LIST_STORE_IS_SORTED (list_store))
+    gtk_list_store_sort_iter_changed (list_store, iter, list_store->sort_column_id);
+
+  if (emit_signal)
+    {
+      GtkTreePath *path;
+
+      path = gtk_list_store_get_path (GTK_TREE_MODEL (list_store), iter);
+      gtk_tree_model_row_changed (GTK_TREE_MODEL (list_store), path, iter);
+      gtk_tree_path_free (path);
+    }
+}
+
 /**
  * gtk_list_store_set_valist:
  * @list_store: A #GtkListStore
@@ -1888,8 +1965,6 @@ gtk_list_store_insert_with_valuesv (GtkListStore *list_store,
   gint length;
   gboolean changed = FALSE;
   gboolean maybe_need_sort = FALSE;
-  GtkTreeIterCompareFunc func = NULL;
-  gint i;
 
   /* FIXME refactor to reduce overlap with 
    * gtk_list_store_insert_with_values() 
@@ -1917,22 +1992,9 @@ gtk_list_store_insert_with_valuesv (GtkListStore *list_store,
 
   list_store->length++;  
 
-  func = gtk_list_store_get_compare_func (list_store);
-  if (func != _gtk_tree_data_list_compare_func)
-    maybe_need_sort = TRUE;
-
-  for (i = 0; i < n_values; i++)
-    {
-      changed = gtk_list_store_real_set_value (list_store, 
-                                              iter, 
-                                              columns[i],
-                                              &values[i],
-                                              FALSE) || changed;
-
-      if (func == _gtk_tree_data_list_compare_func &&
-         columns[i] == list_store->sort_column_id)
-       maybe_need_sort = TRUE;
-    }
+  gtk_list_store_set_vector_internal (list_store, iter,
+                                     &changed, &maybe_need_sort,
+                                     columns, values, n_values);
 
   /* Don't emit rows_reordered here */
   if (maybe_need_sort && GTK_LIST_STORE_IS_SORTED (list_store))
index b985bc677104d90da47a55d964818dbc14a80a88..9aeb81b3c48344442ca965577317a4d2e2e4c5e0 100644 (file)
@@ -87,6 +87,11 @@ void          gtk_list_store_set_value        (GtkListStore *list_store,
 void          gtk_list_store_set              (GtkListStore *list_store,
                                               GtkTreeIter  *iter,
                                               ...);
+void          gtk_list_store_set_valuesv      (GtkListStore *list_store,
+                                              GtkTreeIter  *iter,
+                                              gint         *columns, 
+                                              GValue       *values,
+                                              gint          n_values);
 void          gtk_list_store_set_valist       (GtkListStore *list_store,
                                               GtkTreeIter  *iter,
                                               va_list       var_args);
index 55a89af428ce35778387ffcaa998dd6387cfa7bb..4379af70bba0178e63c2f53d536362a9eaa167ed 100644 (file)
@@ -863,6 +863,34 @@ gtk_tree_store_get_compare_func (GtkTreeStore *tree_store)
   return func;
 }
 
+static void
+gtk_tree_store_set_vector_internal (GtkTreeStore *tree_store,
+                                   GtkTreeIter  *iter,
+                                   gboolean     *emit_signal,
+                                   gboolean     *maybe_need_sort,
+                                   gint         *columns,
+                                   GValue       *values,
+                                   gint          n_values)
+{
+  gint i;
+  GtkTreeIterCompareFunc func = NULL;
+
+  func = gtk_tree_store_get_compare_func (tree_store);
+  if (func != _gtk_tree_data_list_compare_func)
+    *maybe_need_sort = TRUE;
+
+  for (i = 0; i < n_values; i++)
+    {
+      *emit_signal = gtk_tree_store_real_set_value (tree_store, iter,
+                                                   columns[i], &values[i],
+                                                   FALSE) || *emit_signal;
+
+      if (func == _gtk_tree_data_list_compare_func &&
+         columns[i] == tree_store->sort_column_id)
+       *maybe_need_sort = TRUE;
+    }
+}
+
 static void
 gtk_tree_store_set_valist_internal (GtkTreeStore *tree_store,
                                     GtkTreeIter  *iter,
@@ -919,6 +947,52 @@ gtk_tree_store_set_valist_internal (GtkTreeStore *tree_store,
     }
 }
 
+/**
+ * gtk_tree_store_set_valuesv:
+ * @tree_store: A #GtkTreeStore
+ * @iter: A valid #GtkTreeIter for the row being modified
+ * @columns: an array of column numbers
+ * @values: an array of GValues
+ * @n_values: the length of the @columns and @values arrays
+ *
+ * A variant of gtk_tree_store_set_valist() which takes
+ * the columns and values as two arrays, instead of varargs.  This
+ * function is mainly intended for language bindings or in case
+ * the number of columns to change is not known until run-time.
+ *
+ * Since: 2.12
+ **/
+void
+gtk_tree_store_set_valuesv (GtkTreeStore *tree_store,
+                           GtkTreeIter  *iter,
+                           gint         *columns,
+                           GValue       *values,
+                           gint          n_values)
+{
+  gboolean emit_signal = FALSE;
+  gboolean maybe_need_sort = FALSE;
+
+  g_return_if_fail (GTK_IS_TREE_STORE (tree_store));
+  g_return_if_fail (VALID_ITER (iter, tree_store));
+
+  gtk_tree_store_set_vector_internal (tree_store, iter,
+                                     &emit_signal,
+                                     &maybe_need_sort,
+                                     columns, values, n_values);
+
+  if (maybe_need_sort && GTK_TREE_STORE_IS_SORTED (tree_store))
+    gtk_tree_store_sort_iter_changed (tree_store, iter, tree_store->sort_column_id, TRUE);
+
+  if (emit_signal)
+    {
+      GtkTreePath *path;
+
+      path = gtk_tree_store_get_path (GTK_TREE_MODEL (tree_store), iter);
+      gtk_tree_model_row_changed (GTK_TREE_MODEL (tree_store), path, iter);
+      gtk_tree_path_free (path);
+    }
+}
+
 /**
  * gtk_tree_store_set_valist:
  * @tree_store: A #GtkTreeStore
@@ -1394,8 +1468,6 @@ gtk_tree_store_insert_with_valuesv (GtkTreeStore *tree_store,
   GtkTreeIter tmp_iter;
   gboolean changed = FALSE;
   gboolean maybe_need_sort = FALSE;
-  GtkTreeIterCompareFunc func = NULL;
-  gint i;
 
   g_return_if_fail (GTK_IS_TREE_STORE (tree_store));
 
@@ -1418,20 +1490,9 @@ gtk_tree_store_insert_with_valuesv (GtkTreeStore *tree_store,
   iter->user_data = new_node;
   g_node_insert (parent_node, position, new_node);
 
-  func = gtk_tree_store_get_compare_func (tree_store);
-  if (func != _gtk_tree_data_list_compare_func)
-    maybe_need_sort = TRUE;
-
-  for (i = 0; i < n_values; i++)
-    {
-      changed = gtk_tree_store_real_set_value (tree_store, iter,
-                                              columns[i], &values[i],
-                                              FALSE) || changed;
-
-      if (func == _gtk_tree_data_list_compare_func &&
-         columns[i] == tree_store->sort_column_id)
-       maybe_need_sort = TRUE;
-    }
+  gtk_tree_store_set_vector_internal (tree_store, iter,
+                                     &changed, &maybe_need_sort,
+                                     columns, values, n_values);
 
   if (maybe_need_sort && GTK_TREE_STORE_IS_SORTED (tree_store))
     gtk_tree_store_sort_iter_changed (tree_store, iter, tree_store->sort_column_id, FALSE);
index 59d8e777416b62d746c980096ece5adb31acb15c..b7e61e2a1538044cc67a25590ed72487b77c1e11 100644 (file)
@@ -86,6 +86,11 @@ void          gtk_tree_store_set_value        (GtkTreeStore *tree_store,
 void          gtk_tree_store_set              (GtkTreeStore *tree_store,
                                               GtkTreeIter  *iter,
                                               ...);
+void          gtk_tree_store_set_valuesv      (GtkTreeStore *tree_store,
+                                              GtkTreeIter  *iter,
+                                              gint         *columns,
+                                              GValue       *values,
+                                              gint          n_values);
 void          gtk_tree_store_set_valist       (GtkTreeStore *tree_store,
                                               GtkTreeIter  *iter,
                                               va_list       var_args);